package marseillaisdu90.student_life;

import marseillaisdu90.modele.Modele;
import android.app.*;
import android.content.*;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Matrix;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.preference.PreferenceManager;
import android.util.Log;

/**
 * @author Guillaume MONTAVON & Benoit MEILHAC (Master 1 Informatique)
 * Application qui contient les variables globales. elle est accessible dans toutes les activity par (MonApplication)getApplication().
 * Ce qui permet d'acceder dans n'importe quelle activity au modele ((MonApplication)getApplication().getModele()) et a l'activity principale
 */
public class MonApplication extends Application{

	public static Modele modele; //modele
	private static StudentLife sl; //activity principale
	private boolean premierLancement; //true si on vient de lancer l'application,
	public static MediaPlayer mp;
	public static Matrix matrix;
	private NouvellePartie activitePricipale;
	public static boolean aDejaEteLance = false;
	private int numImageIntro;
	//public static StudentLifeThread mthread;
	//si on change l'orientation de l'application, l'activity redemarrera et elle sera a false

	public MonApplication() {
		modele=new Modele();
		premierLancement = true;
		mp = null;
		matrix = new Matrix();
		numImageIntro = 1;
		//mthread = null;
	}

	/**
	 * Permet d'obtenir le modele
	 * @return modele
	 */
	public Modele getModele() {
		return modele;
	}
	
	public void setModele(Modele modele) {
		this.modele = modele;
	}

	public NouvellePartie getActivitePricipale() {
		return activitePricipale;
	}

	public void setActivitePricipale(NouvellePartie activitePricipale) {
		this.activitePricipale = activitePricipale;
	}
	
	public int getNumImageIntro() {
		return numImageIntro;
	}

	public void setNumImageIntro(int numImageIntro) {
		this.numImageIntro = numImageIntro;
	}
	
	public void incNumImageIntro() {
		this.numImageIntro++;
	}
	
	/*
	public static StudentLifeThread getMthread() {
		return mthread;
	}

	public static void setMthread(StudentLifeThread mthread) {
		MonApplication.mthread = mthread;
	}
	*/
	
	/**
	 * Permet d'obtenir l'activity principale
	 * @return activity principale
	 */
	public static StudentLife getSl() {
		return sl;
	}

	public void setSl(StudentLife sl) {
		this.sl = sl;
	}
	
	/**
	 * Permet d'obtenir la version de l'application qui se trouve dans le manifest
	 * @return version de l'application qui se trouve dans le manifest
	 */
	public int getVersionAppli() {
		
		int v = 0;
		try {
			v = getPackageManager().getPackageInfo(getApplicationInfo().packageName, 0).versionCode;
		} catch (NameNotFoundException e) {}
				
		return v;
	}
	
	/**
	 * Permet de connaitre la derniere version lancee par l'utilisateur avant celle-ci
	 * @return derniere version lancee par l'utilisateur avant celle-ci
	 */
	public int getVersionPref() {

		return PreferenceManager.getDefaultSharedPreferences(activitePricipale).getInt("version_appli", 0);
		
	}
	
	/**
	 * Permet de savoir si on lance une nouvelle version de l'application
	 * @return true si on lance une nouvelle version de l'application
	 */
	public boolean testNouvelleVersion() {
		
		if(getVersionAppli() > getVersionPref())
			return true;
		else
			return false;
				
	}
	
	/**
	 * Affiche un message de bienvenu ou des modification qui ont ete apporte dans la nouvelle MAJ
	 */
	public void afficherMessageBienvenu() {
		
		if(testNouvelleVersion()) {
			enregistrerVersionAppliToPref();
			
			String[] listeNews = activitePricipale.getResources().getStringArray(R.array.version_news);
			String message = "";
			if(getVersionAppli() < listeNews.length)
				message = listeNews[getVersionAppli()];
			else
				message = listeNews[0];
			
			AlertDialog.Builder builder = new AlertDialog.Builder(activitePricipale);
			builder.setTitle(R.string.app_name);
			builder.setMessage(message);
			builder.setCancelable(false);
			builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {}
			});
			AlertDialog alert = builder.create();
			alert.show();
		
		}
	}
	
	/**
	 * Enregistre la version de l'application lance comme etant la derniere lancee par l'utilisateur
	 */
	public void enregistrerVersionAppliToPref() {

		SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activitePricipale);
		Editor editor = preferences.edit();
		editor.putInt("version_appli", getVersionAppli());
		editor.commit();
		
	}
	
	/**
	 * Permet de savoir si on vient de lancer l'application
	 * @return true si on vient de lancer l'application
	 */
	public boolean isPremierLancement() {
		return premierLancement;
	}

	public void setPremierLancement(boolean premierLancement) {
		this.premierLancement = premierLancement;
	}
	
	public MediaPlayer getMp() {
		return mp;
	}
	
	public void setMp(MediaPlayer mp) {
		this.mp = mp;
	}
	
	
	public void fermerMusique() {
		Log.i("ferme musique", "ferme musique");

		try {
			mp.stop();
		} catch (Exception e) {}
		
		try {
			mp.release();
		} catch (Exception e) {}
		
		mp = null;
	}
	
	public static void demarrerMusique() {
		Log.i("demarre musique", "demarre musique");
		
		if(mp != null && !mp.isPlaying() && modele.sonActive) {
			//mp.reset();
			/*
	        try {
				mp.prepare();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			*/
		
			mp.setLooping(true);
	    	mp.start();
	    	
	    	mp.setOnCompletionListener(new OnCompletionListener() {
	            @Override
	            public void onCompletion(MediaPlayer mp) {
	                //TODO
	            	Log.i("music","musique fini");
	            	mp.release();
	            }
	        });
		}
	}
	
	public void pauseMusique() {
		Log.i("pause musique", "pause musique");
		if(mp != null)
			mp.pause();
	}
	
	public static void changerMusique(int musique) {
		Log.i("change musique", "change musique");
		if(mp != null) {
			mp.stop();
			mp.release();
			mp = null;
		}
		mp = MediaPlayer.create(sl, musique);

	}
}
